<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('system_configs', function (Blueprint $table) {
            $table->id();
            $table->timestamps();

            // 配置基本信息
            $table->string('config_key', 100)->unique(); // 配置键
            $table->string('config_name', 200); // 配置名称
            $table->text('description')->nullable(); // 配置描述
            $table->string('category', 50); // 配置分类：system, security, performance, ui, business

            // 配置值
            $table->string('value_type', 20); // 值类型：string, integer, float, boolean, json, array
            $table->text('config_value'); // 配置值
            $table->text('default_value')->nullable(); // 默认值
            $table->json('allowed_values')->nullable(); // 允许的值列表

            // 验证规则
            $table->json('validation_rules')->nullable(); // 验证规则
            $table->string('validation_regex', 500)->nullable(); // 正则验证
            $table->integer('min_value')->nullable(); // 最小值（数字类型）
            $table->integer('max_value')->nullable(); // 最大值（数字类型）

            // 状态管理
            $table->boolean('is_active')->default(true); // 是否启用
            $table->boolean('is_system')->default(false); // 是否系统配置
            $table->boolean('is_encrypted')->default(false); // 是否加密存储
            $table->boolean('requires_restart')->default(false); // 是否需要重启生效

            // 权限控制
            $table->string('access_level', 20)->default('admin'); // 访问级别：admin, manager, user
            $table->json('allowed_roles')->nullable(); // 允许访问的角色

            // 生效范围
            $table->string('scope', 20)->default('global'); // 生效范围：global, tenant, user
            $table->unsignedBigInteger('scope_id')->nullable(); // 范围ID（如用户ID、租户ID）

            // 版本控制
            $table->integer('version')->default(1); // 配置版本
            $table->datetime('effective_from')->nullable(); // 生效开始时间
            $table->datetime('effective_to')->nullable(); // 生效结束时间
            $table->string('environment', 20)->default('all'); // 环境：development, staging, production, all

            // 审计信息
            $table->json('change_history')->nullable(); // 变更历史
            $table->datetime('last_modified')->nullable(); // 最后修改时间
            $table->string('last_modified_by', 100)->nullable(); // 最后修改人

            // 缓存设置
            $table->integer('cache_ttl')->default(3600); // 缓存时间（秒）
            $table->boolean('is_cached')->default(true); // 是否缓存

            // 备注和附件
            $table->text('notes')->nullable();
            $table->json('metadata')->nullable(); // 元数据

            // 创建者信息
            $table->string('created_by', 100)->nullable();
            $table->string('updated_by', 100)->nullable();

            // 索引
            $table->index(['category', 'is_active'], 'sc_category_active_idx');
            $table->index(['access_level'], 'sc_access_level_idx');
            $table->index(['scope', 'scope_id'], 'sc_scope_idx');
            $table->index(['environment'], 'sc_environment_idx');
            $table->index(['is_system'], 'sc_system_idx');
            $table->index(['config_key'], 'sc_key_idx');

            // 唯一约束：同一范围内的同一配置键只能有一个值
            $table->unique(['config_key', 'scope', 'scope_id', 'environment'], 'unique_config_scope_env');
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('system_configs');
    }
};
